package leetcode.year2021.month10;

// 48.旋转图像
public class _17_01RotatePicture48 {
  public void rotate(int[][] matrix) {
    // 思路，每个数旋转都是 （i,j -> j, n -i -1 -> n-i-1,n-j-1 -> n-j-1,i）,可以定位到下个坐标，遍历第一象限，旋转 追踪赋值四次，即可

    // 补充，以上思路适用于长度为偶数的，奇数会有不同情况，要控制遍历的边界,可以考虑重构成一个方法
    /**
     *  1、首先旋转90度，长度为n, 那么原本在（a,b）位置的元素就会转换到（b, n-a-1）
     *  2、将二维数组等分为四个象限，那么只需要遍历第一个象限里面的元素，每个元素根据上面的公式变换四次，就可以遍历到整个二维数组
     *  3、根据这个思路，我们可以知道（a,b）-> （b, n-a-1）-> （n-a-1, n-b-1）->（n-b-1, a） -> (a,b)
     *  4、有了这个关系之后，我们就可以遍历第一个象限里面的元素，然后根据这个关系追踪到整个二维数组
     *  5. 考虑阶为奇数时 少遍历的情况
     */

    if (matrix.length < 2){
      return;
    }
    int n = matrix.length;
      for (int i = 0; i < n/2; i++) {
        for (int j = 0; j < (n + 1)/2; j++) {
          int temp = matrix[i][j];
          matrix[i][j] = matrix[n-j-1][i];
          matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
          matrix[n-i-1][n-j-1] = matrix[j][n -i -1];
          matrix[j][n -i -1] = temp;
        }
      }
  }
  /**
   * 48. 旋转图像
   * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
   *
   * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
   *
   *
   *
   * 示例 1：
   *
   *
   * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
   * 输出：[[7,4,1],[8,5,2],[9,6,3]]
   * 示例 2：
   *
   *
   * 输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
   * 输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
   * 示例 3：
   *
   * 输入：matrix = [[1]]
   * 输出：[[1]]
   * 示例 4：
   *
   * 输入：matrix = [[1,2],[3,4]]
   * 输出：[[3,1],[4,2]]
   */
}
